
#include "test_list.h"

#ifdef TEST_PROPERTY_ARRAY

#include <den/meta/property_array.h>


#define TEST_CASE_NAME Den
#define TEST_NUMBER(n) PropertyArray##_##n


#define TEST_PROPERTY_ARRAY_000
#define TEST_PROPERTY_ARRAY_001
#define TEST_PROPERTY_ARRAY_002
#define TEST_PROPERTY_ARRAY_003
#define TEST_PROPERTY_ARRAY_004
#define TEST_PROPERTY_ARRAY_005
#define TEST_PROPERTY_ARRAY_006
#define TEST_PROPERTY_ARRAY_007
#define TEST_PROPERTY_ARRAY_008
#define TEST_PROPERTY_ARRAY_009
#define TEST_PROPERTY_ARRAY_010
#define TEST_PROPERTY_ARRAY_011
#define TEST_PROPERTY_ARRAY_012
#define TEST_PROPERTY_ARRAY_013
#define TEST_PROPERTY_ARRAY_014
#define TEST_PROPERTY_ARRAY_015
#define TEST_PROPERTY_ARRAY_016
#define TEST_PROPERTY_ARRAY_017
#define TEST_PROPERTY_ARRAY_018
#define TEST_PROPERTY_ARRAY_019
#define TEST_PROPERTY_ARRAY_020
#define TEST_PROPERTY_ARRAY_021
#define TEST_PROPERTY_ARRAY_022
#define TEST_PROPERTY_ARRAY_023
#define TEST_PROPERTY_ARRAY_024
#define TEST_PROPERTY_ARRAY_025
#define TEST_PROPERTY_ARRAY_026
#define TEST_PROPERTY_ARRAY_027
#define TEST_PROPERTY_ARRAY_028
#define TEST_PROPERTY_ARRAY_029
#define TEST_PROPERTY_ARRAY_030
#define TEST_PROPERTY_ARRAY_031
#define TEST_PROPERTY_ARRAY_032

//------------------------------------------------------------------------------------------------------//

namespace{

    bool Success(const bool r){ return r; }

    template<class T, class U> void MostBeTrue()
    {
        typedef DetectedArray<T> Detector;
        typedef typename Detector::Array Arr; 
        typedef typename Detector::Element Element;

        EXPECT_EQ(true, Detector::eNO_ARRAY == 0 );
        EXPECT_EQ(true,  Success(::std::is_array<Arr>::value)      );
        EXPECT_EQ(true,  Success(::std::is_same<Element,U>::value) );
    }

    template<class T> void NoArray()
    {
        typedef DetectedArray<T> Detector;
        typedef typename Detector::Array Arr; 
        typedef typename Detector::Element Element;

        EXPECT_EQ(true, Detector::eNO_ARRAY == 1 );
        EXPECT_EQ(true,  Success(::std::is_same<Element,void>::value) );
        EXPECT_EQ(true,  Success(::std::is_same<Arr,void>::value)     );
    }
    
}//namespace

//------------------------------------------------------------------------------------------------------//

#ifdef TEST_PROPERTY_ARRAY_000
TEST(TEST_CASE_NAME, TEST_NUMBER(000))
{
}
#endif // TEST_PROPERTY_ARRAY_000

#ifdef TEST_PROPERTY_ARRAY_001
TEST(TEST_CASE_NAME, TEST_NUMBER(001))
{
    typedef int Arr[1][2][3];
    typedef const int ConstArr[1][2][3];

    typedef RemoveExtend<Arr>::Base         Base;
    typedef RemoveExtend<ConstArr>::Base    ConstBase;

    EXPECT_EQ(true, Success(std::is_same<int, Base>::value)            );
    EXPECT_EQ(true, Success(std::is_same<const int, ConstBase>::value) );
}
#endif // TEST_PROPERTY_ARRAY_001

#ifdef TEST_PROPERTY_ARRAY_002
TEST(TEST_CASE_NAME, TEST_NUMBER(002))
{
    typedef int Arr[1][2][3];
    typedef const int ConstArr[1][2][3];

    typedef RemoveExtend<Arr>::Base         Base;
    typedef RemoveExtend<ConstArr>::Base    ConstBase;

    EXPECT_EQ(true, Success(std::is_same<int, Base>::value)            );
    EXPECT_EQ(true, Success(std::is_same<const int, ConstBase>::value) );
}
#endif // TEST_PROPERTY_ARRAY_002

#ifdef TEST_PROPERTY_ARRAY_003
TEST(TEST_CASE_NAME, TEST_NUMBER(003))
{
    MostBeTrue<int      [5][24][60], int>();
    MostBeTrue<int (  *)[5][24][60], int>();
    MostBeTrue<int (  &)[5][24][60], int>();
    MostBeTrue<int ( *&)[5][24][60], int>();
    MostBeTrue<int ( **)[5][24][60], int>();
    MostBeTrue<int (**&)[5][24][60], int>();

    MostBeTrue<const int      [5][24][60], const int>();
    MostBeTrue<const int (  *)[5][24][60], const int>();
    MostBeTrue<const int (  &)[5][24][60], const int>();
    MostBeTrue<const int ( *&)[5][24][60], const int>();
    MostBeTrue<const int ( **)[5][24][60], const int>();
    MostBeTrue<const int (**&)[5][24][60], const int>();
}
#endif // TEST_PROPERTY_ARRAY_003

#ifdef TEST_PROPERTY_ARRAY_004
TEST(TEST_CASE_NAME, TEST_NUMBER(004))
{
    NoArray<int>();
    NoArray<int*>();
}
#endif // TEST_PROPERTY_ARRAY_004

#ifdef TEST_PROPERTY_ARRAY_005
#endif // TEST_PROPERTY_ARRAY_005

#ifdef TEST_PROPERTY_ARRAY_006
#endif // TEST_PROPERTY_ARRAY_006

#ifdef TEST_PROPERTY_ARRAY_007
#endif // TEST_PROPERTY_ARRAY_007

#ifdef TEST_PROPERTY_ARRAY_008
#endif // TEST_PROPERTY_ARRAY_008

#ifdef TEST_PROPERTY_ARRAY_009
#endif // TEST_PROPERTY_ARRAY_009

#ifdef TEST_PROPERTY_ARRAY_010
#endif // TEST_PROPERTY_ARRAY_010

#ifdef TEST_PROPERTY_ARRAY_011
#endif // TEST_PROPERTY_ARRAY_011

#ifdef TEST_PROPERTY_ARRAY_012
#endif // TEST_PROPERTY_ARRAY_012

#ifdef TEST_PROPERTY_ARRAY_013
#endif // TEST_PROPERTY_ARRAY_013

#ifdef TEST_PROPERTY_ARRAY_014
#endif // TEST_PROPERTY_ARRAY_014

#ifdef TEST_PROPERTY_ARRAY_015
#endif // TEST_PROPERTY_ARRAY_015

#ifdef TEST_PROPERTY_ARRAY_016
#endif // TEST_PROPERTY_ARRAY_016

#ifdef TEST_PROPERTY_ARRAY_017
#endif // TEST_PROPERTY_ARRAY_017

#ifdef TEST_PROPERTY_ARRAY_018
#endif // TEST_PROPERTY_ARRAY_018

#ifdef TEST_PROPERTY_ARRAY_019
#endif // TEST_PROPERTY_ARRAY_019

#ifdef TEST_PROPERTY_ARRAY_020
#endif // TEST_PROPERTY_ARRAY_020

#ifdef TEST_PROPERTY_ARRAY_021
#endif // TEST_PROPERTY_ARRAY_021

#ifdef TEST_PROPERTY_ARRAY_022
#endif // TEST_PROPERTY_ARRAY_022

#ifdef TEST_PROPERTY_ARRAY_023
#endif // TEST_PROPERTY_ARRAY_023

#ifdef TEST_PROPERTY_ARRAY_024
#endif // TEST_PROPERTY_ARRAY_024

#ifdef TEST_PROPERTY_ARRAY_025
#endif // TEST_PROPERTY_ARRAY_025

#ifdef TEST_PROPERTY_ARRAY_026
#endif // TEST_PROPERTY_ARRAY_026

#ifdef TEST_PROPERTY_ARRAY_027
#endif // TEST_PROPERTY_ARRAY_027

#ifdef TEST_PROPERTY_ARRAY_028
#endif // TEST_PROPERTY_ARRAY_028

#ifdef TEST_PROPERTY_ARRAY_029
#endif // TEST_PROPERTY_ARRAY_029

#ifdef TEST_PROPERTY_ARRAY_030
#endif // TEST_PROPERTY_ARRAY_030

#ifdef TEST_PROPERTY_ARRAY_031
#endif // TEST_PROPERTY_ARRAY_031

#ifdef TEST_PROPERTY_ARRAY_032
#endif // TEST_PROPERTY_ARRAY_032





#endif //TEST_PROPERTY_ARRAY



